package inventario.code;

/**
 * Projeto Laboratorio de Programacao II
 * 
 * Classe Maquina.
 * 
 * Implementa uma Maquina com nome, atributos e status
 * 
 * @authors : Pedro Augusto, Rafael Ribeiro, Talita Lobo
 * 
 */

import java.util.Map;



public class Maquina {

	private String nome;
	private Map<String, String> atributos;
	private boolean funcionando;
	private boolean alocado;

	/**
	 * 
	 * 
	 * @param nome
	 *            Nome da maquina
	 * 
	 * @param atributos
	 *            Mapa com Atributos da Maquina.
	 * 
	 * @param funcionando
	 *            Estado da Maquina(Funcionando ou Nao)
	 * 
	 * @exception Caso
	 *                o Nome da Maquina seja invalido/nulo. Caso seja o os
	 *                atributos passados sejam null;
	 */
	public Maquina(String nome, Map<String, String> atributos,
			boolean funcionando) throws Exception {

		if (atributos == null) {
			throw new Exception("Atributos Invalidos. ");
		}

		if (nome == null || nome.trim().equals("")) {
			throw new Exception("Nome da Maquina Invalido. ");
		}
		this.nome = nome;
		this.atributos = atributos;
		this.funcionando = funcionando;
		this.alocado = false;
	}

	/**
	 * Recupera o nome da Maquina.
	 * 
	 * @return nome Nome da Maquina
	 */
	public String getNome() {
		return this.nome;
	}

	/**
	 * Verifica se a Maquina esta Funcionando.
	 * 
	 * @return funcionando O Estado da Maquina.
	 */
	public boolean getFuncionando() {
		return funcionando;
	}

	/**
	 * Modifica o Estado da Maquina;
	 * 
	 * @param novofuncionando
	 *            Novo estado da Maquina(True p/ Funcionando, False caso
	 *            contrario).
	 * 
	 */
	public void setFuncionando(boolean novoFuncionando) {
		funcionando = novoFuncionando;
	}

	/**
	 * Verifica se a Maquina Esta Alocada
	 * 
	 * @return alocado true, caso a maquina esteja sendo usada, false caso
	 *         contrario.
	 */

	public boolean getAlocado() {
		return alocado;
	}

	/**
	 * Modifica o Estado de Uso da Maquina
	 * 
	 * @param alocado
	 *            Novo Estado de Uso da Maquina. True caso esteja sendo usada,
	 *            false caso contrario
	 */

	public void setAlocado(boolean alocado) {
		this.alocado = alocado;
	}

	/**
	 * Recupera os Atributos da maquina;
	 * 
	 * @return atributos Um Map<String, String> com todos os atributos da
	 *         maquina.
	 */
	public Map<String, String> getAtributos() {
		return atributos;
	}

	/**
	 * Recupera todas Informacoes sobre a maquina.
	 * 
	 * @return Todas as Informações sobre a Maquina.
	 */
	public String toString() {
		return "Nome - " + getNome() + "\nAlocado - " + getAlocado()
				+ "\nFuncionando - " + getFuncionando() + "\nAtributos - "
				+ getAtributos().toString();
	}

	/**
	 * Dado um Objeto(Maquina ou nao) Verifica a Igualdade entre a maquina.
	 * 
	 * @param Objeto
	 *            a ser comparado.
	 * @return True caso o Obejto passado seja igual a maquina, false caso
	 *         contrario.
	 */

	public boolean equals(Object maquinaEquals) {
		if (!(maquinaEquals instanceof Maquina)) {
			return false;
		}

		Maquina maquinaE = (Maquina) maquinaEquals;

		return getNome().equals(maquinaE.getNome())
				&& atributos.equals(maquinaE.atributos)
				&& (getAlocado() == maquinaE.getAlocado())
				&& (getFuncionando() == maquinaE.getFuncionando())
				&& (getAtributos().equals(maquinaE.getAtributos()));
	}
}